//采用单例模式，编译时加上-llog4cpp -lpthread
//格式 时间：（不知名数字）：函数信息（名，行号等）+需要输出的内容
//使用时使用以下四种格式输出到 .log文件中
//LogError(msg) 
//LogWarn(msg)  
//LogInfo(msg)  
//LogDebug(msg) 
//example:
//
//void test(){
//    LogError("error test2");
//    LogWarn("warn test2");
//    LogInfo("info test2");
//    LogDebug("debug test2");
//
//}
//

//v1.0  存在问题：
//在调用之后，程序结束时必须调用Mylog::destroy()来终止日志记录
//当在多线程中使用时，当两个线程同时对该单例模式进行实例化，导致不符合单例模式要求，
//存在不安全问题

//v2.0(修改中)：采用饿汉模式，线程本身为安全的，不用进行加锁导致大量线程阻塞


#ifndef _MYLOG_H_
#define _MYLOG_H_

#include<log4cpp/Category.hh>
#include<string>

using std::string;
using namespace log4cpp;

class Mylog
{
public:
    static Mylog * getInstance();
    static void destroy();

    void error(const string &);
    void warn (const string &);
    void info (const string &);
    void debug (const string &);
private:
    Mylog();
    ~Mylog();
    Mylog(const Mylog &)=delete ;
    Mylog &operator=(const Mylog &)=delete;

private:
    Category &_mylog;
    static Mylog *_pInstance;
};
// 输出日志信息的格式：【文件名】：【函数名】：【行号】错误信息
// __FILE__宏定义：文件名
// __func__宏定义：函数名
// __LINE__宏定义：行号
#define addprefix(msg) string("[").append(__FILE__).append(" : ")\
    .append(__func__).append(" : ").append(std::to_string(__LINE__))\
    .append("] ").append(msg).c_str()

#define LogError(msg) Mylog::getInstance()->error(addprefix(msg))
#define LogWarn(msg)  Mylog::getInstance()->warn(addprefix(msg))
#define LogInfo(msg)  Mylog::getInstance()->info(addprefix(msg))
#define LogDebug(msg) Mylog::getInstance()->debug(addprefix(msg))



#endif
